home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / DJSRC111.ZIP / go32 / dpmisim.asm < prev    next >
Assembly Source File  |  1993-08-07  |  5KB  |  291 lines

  1. ; This is file DPMISIM.ASM
  2. ;
  3. ; Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  4. ;
  5. ; This file is distributed under the terms listed in the document
  6. ; "copying.dj", available from DJ Delorie at the address above.
  7. ; A copy of "copying.dj" should accompany this file; if not, a copy
  8. ; should be available from where this file was obtained.  This file
  9. ; may not be distributed without a verbatim copy of "copying.dj".
  10. ;
  11. ; This file is distributed WITHOUT ANY WARRANTY; without even the implied
  12. ; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. ;
  14.  
  15.     title    dpmisim
  16.     .386p
  17.  
  18.     include    segdefs.inc
  19.     include tss.inc
  20.     include gdt.inc
  21.     include idt.inc
  22.  
  23. ;------------------------------------------------------------------------
  24.  
  25.     start_data16
  26.  
  27.     extrn    _r_tss:tss_s
  28.     extrn    _arena_cs:word
  29.     extrn    _arena_ds:word
  30.     extrn    _core_selector:word
  31.     extrn    _tss_ptr:word
  32.     extrn    _ARENA:dword
  33.  
  34.     public    _dpmisim_type
  35. _dpmisim_type    db    0
  36.  
  37.     public    _dpmisim_vec
  38. _dpmisim_vec    db    0
  39.  
  40.     public    _dpmisim_regs
  41. _dpmisim_regs    label    dword
  42. ds_edi    dd    ?
  43. ds_esi    dd    ?
  44. ds_ebp    dd    ?
  45. ds_res    dd    ?
  46. ds_ebx    dd    ?
  47. ds_edx    dd    ?
  48. ds_ecx    dd    ?
  49. ds_eax    dd    ?
  50. ds_flg    dw    ?
  51. ds_es    dw    ?
  52. ds_ds    dw    ?
  53. ds_fs    dw    ?
  54. ds_gs    dw    ?
  55. ds_ip    dw    ?
  56. ds_cs    dw    ?
  57. ds_sp    dw    ?
  58. ds_ss    dw    ?
  59.  
  60.     public    _dpmisim_rmcb
  61. _dpmisim_rmcb    dd    32 dup(?)
  62.  
  63.     dd    128 dup (?)
  64. rmcb_temp_stack32    label    dword
  65.     dd    offset rmcb_task_switch
  66.     dw    g_rcode
  67.  
  68.     dw    128 dup (?)
  69. rmcb_temp_stack16    label    word
  70.  
  71.     end_data16
  72.  
  73. ;------------------------------------------------------------------------
  74.  
  75.     start_code16
  76.  
  77.     extrn    _memput:near
  78.     extrn    _memget:near
  79.     extrn    _go_til_stop:near
  80.  
  81. ds_savesp    dw    ?
  82. ds_savess    dw    ?
  83. ds_tmpds    dw    ?
  84.  
  85.     public    _dpmisim
  86. _dpmisim:
  87.  
  88.     pusha
  89.     push    es
  90.  
  91.     mov    cs:[ds_savesp], sp
  92.     mov    cs:[ds_savess], ss
  93.  
  94.     mov    ax,ds_flg
  95.     and    ax,0fcffh
  96.     push    ax
  97.     popf
  98.  
  99.     mov    edi, ds_edi
  100.     mov    esi, ds_esi
  101.     mov    ebp, ds_ebp
  102.     mov    ebx, ds_ebx
  103.     mov    edx, ds_edx
  104.     mov    ecx, ds_ecx
  105.     mov    eax, ds_eax
  106.     mov    es, ds_es
  107.     mov    fs, ds_fs
  108.     mov    gs, ds_gs
  109.     mov    ss, ds_ss
  110.     mov    sp, ds_sp
  111.  
  112.     push    cs
  113.     push    offset dpmisim_return
  114.     push    ds_cs
  115.     push    ds_ip
  116.     mov    ds, ds_ds
  117.     retf    ; actually a far call in disguise
  118. dpmisim_return:
  119.  
  120.     mov    cs:[ds_tmpds], ds
  121.     push    DGROUP
  122.     pop    ds
  123.     pushf
  124.     pop    ds_flg
  125.  
  126.     mov    ds_edi, edi
  127.     mov    ds_esi, esi
  128.     mov    ds_ebp, ebp
  129.     mov    ds_ebx, ebx
  130.     mov    ds_edx, edx
  131.     mov    ds_ecx, ecx
  132.     mov    ds_eax, eax
  133.     mov    ds_es, es
  134.     mov    ds_fs, fs
  135.     mov    ds_gs, gs
  136.     mov    ds_ss, ss
  137.     mov    ds_sp, sp
  138.     
  139.     mov    ax, cs:[ds_tmpds]
  140.     mov    ds_ds, ax
  141.  
  142.     mov    ss, cs:[ds_savess]
  143.     mov    sp, cs:[ds_savesp]
  144.  
  145.     pop    es
  146.     popa
  147.     ret
  148.  
  149. rmcb_number    db    ?
  150.  
  151. rmcb    macro    n
  152.     mov    cs:[rmcb_number],n
  153.     jmp    short rmcb_common
  154.     endm
  155.  
  156.     public    _dpmisim_rmcb0
  157. _dpmisim_rmcb0:
  158.     rmcb    0
  159.     public    _dpmisim_rmcb1
  160. _dpmisim_rmcb1:
  161.     x=1
  162.     rept 15
  163.      rmcb x
  164.      x=x+1
  165.     endm
  166.  
  167. rmcb_common:
  168.     mov    cs:[ds_tmpds], ds
  169.     push    DGROUP
  170.     pop    ds
  171.     pushf
  172.     pop    ds_flg
  173.  
  174.     mov    ds_edi, edi        ; save registers
  175.     mov    ds_esi, esi
  176.     mov    ds_ebp, ebp
  177.     mov    ds_ebx, ebx
  178.     mov    ds_edx, edx
  179.     mov    ds_ecx, ecx
  180.     mov    ds_eax, eax
  181.     mov    ds_es, es
  182.     mov    ds_fs, fs
  183.     mov    ds_gs, gs
  184.     mov    ds_ss, ss
  185.     mov    ds_sp, sp
  186.  
  187.     mov    ax,ds            ; set up our local stack
  188.     mov    ss,ax
  189.     mov    sp, offset rmcb_temp_stack16
  190.  
  191.     push    ds
  192.     pop    es
  193.     
  194.     mov    bl, cs:[rmcb_number]
  195.     mov    bh,0
  196.     shl    bx,3
  197.  
  198.     push    bx
  199.     push    50            ; copy the registers to protected memory
  200.     push    ds
  201.     push    offset _dpmisim_regs
  202.     mov    eax,_dpmisim_rmcb[bx+4]
  203.     add    eax,_ARENA
  204.     push    eax
  205.     call    _memput
  206.     add    sp,10
  207.     pop    bx
  208.  
  209.     mov    ax, _arena_cs        ; cs:eip for function to call
  210.     mov    _r_tss.tss_cs, ax
  211.     mov    eax, _dpmisim_rmcb[bx]
  212.     mov    _r_tss.tss_eip, eax
  213.  
  214.     mov    ax, _arena_ds        ; es:edi for pointer to registers
  215.     mov    _r_tss.tss_es, ax
  216.     mov    eax, _dpmisim_rmcb[bx+4]
  217.     mov    _r_tss.tss_edi, eax
  218.  
  219.     mov    ax, _core_selector    ; ds:esi for pointer to caller stack
  220.     mov    _r_tss.tss_ds, ax
  221.     mov    eax,0
  222.     mov    ax,ds_ss
  223.     shl    eax,4
  224.     mov    ebx,0
  225.     mov    bx,ds_sp
  226.     add    eax,ebx
  227.     mov    _r_tss.tss_esi, eax
  228.  
  229.     mov    ax, _core_selector    ; ss:esp for pointer to temp stack
  230.     mov    _r_tss.tss_ss, ax
  231.     mov    eax,0
  232.     mov    ax,ds
  233.     shl    eax,4
  234.     mov    ebx,0
  235.     mov    bx,offset rmcb_temp_stack32
  236.     add    eax,ebx
  237.     and    eax,0fffffffch
  238.     mov    _r_tss.tss_esp, eax
  239.  
  240.     push    _tss_ptr
  241.     mov    ax,offset _r_tss
  242.     mov    _tss_ptr,ax
  243.  
  244.     call    _go_til_stop
  245.     
  246.     pop    _tss_ptr
  247.  
  248.     mov    bl, cs:[rmcb_number]
  249.     mov    bh,0
  250.     shl    bx,3
  251.  
  252.     push    bx    
  253.     push    50            ; copy the registers from protected memory
  254.     push    ds
  255.     push    offset _dpmisim_regs
  256.     mov    eax,_dpmisim_rmcb[bx+4]
  257.     add    eax,_ARENA
  258.     push    eax
  259.     call    _memget
  260.     add    sp,10
  261.     pop    bx
  262.  
  263.     mov    ss,ds_ss
  264.     mov    sp,ds_sp
  265.  
  266.     mov    edi, ds_edi
  267.     mov    esi, ds_esi
  268.     mov    ebp, ds_ebp
  269.     mov    ebx, ds_ebx
  270.     mov    edx, ds_edx
  271.     mov    ecx, ds_ecx
  272.     mov    eax, ds_eax
  273.     mov    es, ds_es
  274.     mov    fs, ds_fs
  275.     mov    gs, ds_gs
  276.  
  277.     push    ds_flg
  278.     push    ds_cs
  279.     push    ds_ip
  280.     mov    ds, ds_ds
  281.     iret            ; jmp to wherever the regs said to
  282.  
  283. rmcb_task_switch:
  284.     jmpt    g_ctss
  285.  
  286.     end_code16
  287.  
  288. ;------------------------------------------------------------------------
  289.  
  290.     end
  291.